home *** CD-ROM | disk | FTP | other *** search
Text File | 1998-01-23 | 14.4 KB | 574 lines | [TEXT/CWIE] |
- /******************** ***********************/
- //
- // Player PRO 4.6 - DRIVER SOURCE CODE -
- //
- // Library Version 4.6
- //
- // To use with MAD Library for Mac: Symantec, CodeWarrior and MPW
- //
- // Antoine ROSSET
- // 16 Tranchees
- // 1206 GENEVA
- // SWITZERLAND
- //
- // COPYRIGHT ANTOINE ROSSET 1996, 1997, 1998
- //
- // Thank you for your interest in PlayerPRO !
- //
- // FAX: (+41 22) 346 11 97
- // PHONE: (+41 79) 203 74 62
- // Internet: rosset@dial.eunet.ch or RossetAntoine@bluewin.ch
- //
- /******************** ***********************/
-
- #include "RDriver.h"
- #include "RDriverInt.h"
-
- #define TICKREMOVESIZE2 500L
-
- void Sampler16Add( Channel *curVoice, register short *ASCBuffer, MADDriverRec* intDriver)
- {
- Ptr SndBuffer;
- Byte tByte;
- short *VolPtr, i = intDriver->ASCBUFFER;
-
- ///
- long off, aDD, aCC = curVoice->lAC;
-
- aDD = (AMIGA_CLOCKFREQ2 << BYTEDIV) / ( curVoice->period * (intDriver->DriverSettings.outPutRate>>16));
- ///
-
- if( curVoice->prevPtr != curVoice->begPtr)
- {
- if( curVoice->lastWord != 0)
- {
- curVoice->curLevel = TICKREMOVESIZE2;
- curVoice->curLastWord = curVoice->lastWord;
- curVoice->lastWord = 0;
-
- curVoice->prevPtr = curVoice->begPtr;
- }
- }
-
- if( curVoice->curLevel > 0)
- {
- short *ASCBufferCopy = ASCBuffer;
-
- while( i-- > 0)
- {
- *(ASCBuffer) += (curVoice->curLastWord * curVoice->curLevel) / TICKREMOVESIZE2;
- if( curVoice->curLevel > 0) curVoice->curLevel--;
- ASCBuffer += 2;
- }
-
- i = intDriver->ASCBUFFER;
- ASCBuffer = ASCBufferCopy;
- }
-
- if( curVoice->curPtr >= curVoice->maxPtr && curVoice->loopSize == 0) return;
-
- SndBuffer = curVoice->curPtr;
- VolPtr = (short*) ( intDriver->Vol + (((DoVol( curVoice) * intDriver->VolExt[ curVoice->ID])/ 64) <<8)*2L);
-
- if( SndBuffer + 1 + (long) ((aCC + aDD * intDriver->ASCBUFFER)>>BYTEDIV) >= curVoice->maxPtr)
- {
- if( intDriver->DriverSettings.Interpolation)
- {
- long RightWeight, LeftWeight;
-
- while( i-- > 0)
- {
- RightWeight = aCC & ((1 << BYTEDIV) - 1); LeftWeight = (1 << BYTEDIV) - RightWeight;
-
- off = (aCC>>BYTEDIV);
- if( SndBuffer + off + 1 >= curVoice->maxPtr)
- {
- if( curVoice->loopSize > 0)
- {
- SndBuffer -= curVoice->loopSize;
- if( SndBuffer + off < curVoice->begPtr) SndBuffer = curVoice->begPtr - off;
- }
- else // If TICK remove
- {
- aCC -= aDD;
- curVoice->lastWord = *(VolPtr + ((Byte)*(SndBuffer + (long) (aCC>>BYTEDIV))));
- aCC += aDD;
-
- i++;
- while( i-- > 0)
- {
- *(ASCBuffer) += curVoice->lastWord;
- ASCBuffer += 2;
- }
-
- curVoice->prevPtr = 0L;
-
- break;
- }
- }
-
- tByte = (( LeftWeight **(SndBuffer + off)
- + RightWeight **(SndBuffer + off + 1)) >> BYTEDIV);
-
- *(ASCBuffer) += *(VolPtr + tByte ); aCC += aDD;
- ASCBuffer += 2;
- }
-
- curVoice->lastWord = *(VolPtr + tByte);
- }
- else
- {
- while( i-- > 0)
- {
- off = (aCC>>BYTEDIV);
- if( SndBuffer + off + 1 >= curVoice->maxPtr)
- {
- if( curVoice->loopSize > 0)
- {
- SndBuffer -= curVoice->loopSize;
- if( SndBuffer + off < curVoice->begPtr) SndBuffer = curVoice->begPtr - off;
- }
- else // If TICK remove
- {
- aCC -= aDD;
- curVoice->lastWord = *(VolPtr + ((Byte)*(SndBuffer + (long) (aCC>>BYTEDIV))));
- aCC += aDD;
-
- i++;
- while( i-- > 0)
- {
- *(ASCBuffer) += curVoice->lastWord;
- ASCBuffer += 2;
- }
- break;
- }
- }
- *(ASCBuffer) += *(VolPtr + ((Byte)*(SndBuffer + off))); aCC += aDD;
- ASCBuffer += 2;
- }
-
- /**/
- aCC -= aDD;
- curVoice->lastWord = *(VolPtr + ((Byte)*(SndBuffer + (long) (aCC>>BYTEDIV))));
- aCC += aDD;
- /**/
- }
-
- if( curVoice->loopSize > 0) curVoice->curPtr = (Ptr) (SndBuffer + (long) (aCC>>BYTEDIV));
- else
- {
- curVoice->samplePtr = 0L; curVoice->curPtr = curVoice->maxPtr;
- }
- }
- else
- {
- if( intDriver->DriverSettings.Interpolation)
- {
- long RightWeight, LeftWeight;
-
- while( i-- > 0)
- {
- RightWeight = aCC & ((1 << BYTEDIV) - 1); LeftWeight = (1 << BYTEDIV) - RightWeight;
-
- off = (aCC>>BYTEDIV);
- tByte = (( LeftWeight **(SndBuffer + off)
- + RightWeight **(SndBuffer + off + 1)) >> BYTEDIV);
-
- *(ASCBuffer) += *(VolPtr + tByte); aCC += aDD;
- ASCBuffer += 2;
- }
-
- /**/
- curVoice->lastWord = *(VolPtr + tByte);
- /**/
- }
- else
- {
- while( i-- > 0)
- {
- off = (aCC>>BYTEDIV);
- *(ASCBuffer) += *(VolPtr + ((Byte)*(SndBuffer + (long) (aCC>>BYTEDIV)))); aCC += aDD;
- ASCBuffer += 2;
- }
-
- /**/
- aCC -= aDD;
- curVoice->lastWord = *(VolPtr + ((Byte)*(SndBuffer + (long) (aCC>>BYTEDIV))));
- aCC += aDD;
- /**/
- }
-
- curVoice->curPtr = (Ptr) (SndBuffer + (long) (aCC>>BYTEDIV));
- }
-
- curVoice->lAC = aCC & ((1 << BYTEDIV) - 1);
- }
-
- void Sampler16Addin16( Channel *curVoice, register short *ASCBuffer, MADDriverRec* intDriver)
- {
- short i = intDriver->ASCBUFFER, vol, tByte;
- short *SndBuffer;
- long chnVol;
-
- ///
- long off, aDD, aCC = curVoice->lAC;
-
- aDD = (AMIGA_CLOCKFREQ2 << BYTEDIV) / ( curVoice->period * (intDriver->DriverSettings.outPutRate>>16));
- ///
-
- if( curVoice->curPtr >= curVoice->maxPtr && curVoice->loopSize == 0) return;
-
- SndBuffer = (short*) curVoice->curPtr;
- vol = (short) 64 * intDriver->trackDiv; // * 2; //intDriver->trackDiv;
- chnVol = ((DoVol( curVoice) * intDriver->VolExt[ curVoice->ID])/ 64);
-
- if( SndBuffer + 1 + (long) ((aCC + aDD * intDriver->ASCBUFFER)>>BYTEDIV) >= ( short*) curVoice->maxPtr)
- {
- if( intDriver->DriverSettings.Interpolation)
- {
- long RightWeight, LeftWeight;
-
- while( i-- > 0)
- {
- RightWeight = aCC & ((1 << BYTEDIV) - 1); LeftWeight = (1 << BYTEDIV) - RightWeight;
-
- off = (aCC>>BYTEDIV);
- if( SndBuffer + off + 1 >= (short*) curVoice->maxPtr)
- {
- if( curVoice->loopSize > 0)
- {
- SndBuffer -= curVoice->loopSize/2;
- if( SndBuffer + off < (short*) curVoice->begPtr) SndBuffer = (short*) curVoice->begPtr - off;
- }
- else break;
- }
-
- tByte = (( LeftWeight **(SndBuffer + off)
- + RightWeight **(SndBuffer + off + 1)) >> BYTEDIV);
-
- *ASCBuffer += (tByte * chnVol) / vol; aCC += aDD;
- ASCBuffer += 2;
- }
- }
- else
- {
- while( i-- > 0)
- {
- off = (aCC>>BYTEDIV);
- if( SndBuffer + off + 1 >= (short*) curVoice->maxPtr)
- {
- if( curVoice->loopSize > 0)
- {
- SndBuffer -= curVoice->loopSize;
- if( SndBuffer + off < (short*) curVoice->begPtr) SndBuffer = (short*) curVoice->begPtr - off;
- }
- else break;
- }
- *ASCBuffer += (*(SndBuffer + off) * chnVol) / vol; aCC += aDD;
- ASCBuffer += 2;
- }
- }
-
- if( curVoice->loopSize > 0) curVoice->curPtr = (Ptr) (SndBuffer + (long) (aCC>>BYTEDIV));
- else
- {
- curVoice->samplePtr = 0L; curVoice->curPtr = curVoice->maxPtr;
- }
- }
- else
- {
- if( intDriver->DriverSettings.Interpolation)
- {
- long RightWeight, LeftWeight;
-
- while( i-- > 0)
- {
- RightWeight = aCC & ((1 << BYTEDIV) - 1); LeftWeight = (1 << BYTEDIV) - RightWeight;
-
- off = (aCC>>BYTEDIV);
- tByte = (( LeftWeight **(SndBuffer + off)
- + RightWeight **(SndBuffer + off + 1)) >> BYTEDIV);
-
- *ASCBuffer += (tByte * chnVol) / vol; aCC += aDD;
- ASCBuffer += 2;
- }
- }
- else
- {
- while( i-- > 0)
- {
- off = (aCC>>BYTEDIV);
- *ASCBuffer += (*(SndBuffer + off) * chnVol) / vol; aCC += aDD;
- ASCBuffer += 2;
- }
- }
- curVoice->curPtr = (Ptr) (SndBuffer + (long) (aCC>>BYTEDIV));
- }
-
- curVoice->lAC = aCC & ((1 << BYTEDIV) - 1);
- }
-
-
- void Sample16BufferAdd( Channel *curVoice, register short *ASCBuffer, MADDriverRec* intDriver)
- {
- if( curVoice->amp == 16) Sampler16Addin16( curVoice, ASCBuffer, intDriver);
- else Sampler16Add( curVoice, ASCBuffer, intDriver);
- }
-
- void Play16Stereo( MADDriverRec* intDriver)
- {
- short i;
- short *ttt = (short*) intDriver->IntDataPtr;
-
- i = intDriver->ASCBUFFER*2;
- while( i != 0) ttt[ --i] = 0;
-
- for( i = 0 ; i < intDriver->DriverSettings.numChn; i++)
- {
- Sample16BufferAdd( &intDriver->chan[ i], (short*) intDriver->IntDataPtr, intDriver);
- i++;
- Sample16BufferAdd( &intDriver->chan[ i], (short*) (intDriver->IntDataPtr) + 1, intDriver);
- }
- }
-
- void Sampler16AddPoly( Channel *curVoice, register short *ASCBuffer, short chanNo, MADDriverRec* intDriver)
- {
- Ptr SndBuffer;
- short *VolPtr, i = intDriver->ASCBUFFER;
- Byte tByte;
-
- ///
- long off, aDD, aCC = curVoice->lAC;
-
- aDD = (AMIGA_CLOCKFREQ2 << BYTEDIV) / ( curVoice->period * (intDriver->DriverSettings.outPutRate>>16));
- ///
-
- if( curVoice->curPtr >= curVoice->maxPtr && curVoice->loopSize == 0) return;
-
- SndBuffer = curVoice->curPtr;
- VolPtr = (short*) ( intDriver->Vol + (((DoVol( curVoice) * intDriver->VolExt[ curVoice->ID])/ 64) <<8)*2L);
-
- if( SndBuffer + 1 + (long) ((aCC + aDD * intDriver->ASCBUFFER)>>BYTEDIV) >= curVoice->maxPtr)
- {
- if( intDriver->DriverSettings.Interpolation)
- {
- long RightWeight, LeftWeight;
-
- while( i-- > 0)
- {
- RightWeight = aCC & ((1 << BYTEDIV) - 1); LeftWeight = (1 << BYTEDIV) - RightWeight;
-
- off = (aCC>>BYTEDIV);
- if( SndBuffer + off + 1 >= curVoice->maxPtr)
- {
- if( curVoice->loopSize > 0)
- {
- SndBuffer -= curVoice->loopSize;
- if( SndBuffer + off < curVoice->begPtr) SndBuffer = curVoice->begPtr - off;
- }
- else break;
- }
-
- tByte = (( LeftWeight **(SndBuffer + off)
- + RightWeight **(SndBuffer + off + 1)) >> BYTEDIV);
-
- *(ASCBuffer) += *(VolPtr + tByte ); aCC += aDD;
- ASCBuffer += chanNo;
- }
- }
- else
- {
- while( i-- > 0)
- {
- off = (aCC>>BYTEDIV);
- if( SndBuffer + off + 1 >= curVoice->maxPtr)
- {
- if( curVoice->loopSize > 0)
- {
- SndBuffer -= curVoice->loopSize;
- if( SndBuffer + off < curVoice->begPtr) SndBuffer = curVoice->begPtr - off;
- }
- else break;
- }
- *(ASCBuffer) += *(VolPtr + ((Byte)*(SndBuffer + (long) (aCC>>BYTEDIV)))); aCC += aDD;
- ASCBuffer += chanNo;
- }
- }
-
- if( curVoice->loopSize > 0) curVoice->curPtr = (Ptr) (SndBuffer + (long) (aCC>>BYTEDIV));
- else
- {
- curVoice->samplePtr = 0L; curVoice->curPtr = curVoice->maxPtr;
- }
- }
- else
- {
- if( intDriver->DriverSettings.Interpolation)
- {
- long RightWeight, LeftWeight;
-
- while( i-- > 0)
- {
- RightWeight = aCC & ((1 << BYTEDIV) - 1); LeftWeight = (1 << BYTEDIV) - RightWeight;
-
- off = (aCC>>BYTEDIV);
- tByte = (( LeftWeight **(SndBuffer + off)
- + RightWeight **(SndBuffer + off + 1)) >> BYTEDIV);
-
- *(ASCBuffer) += *(VolPtr + tByte ); aCC += aDD;
- ASCBuffer += chanNo;
- }
- }
- else
- {
- while( i-- > 0)
- {
- off = (aCC>>BYTEDIV);
- *(ASCBuffer) += *(VolPtr + ((Byte)*(SndBuffer + (long) (aCC>>BYTEDIV)))); aCC += aDD;
- ASCBuffer += chanNo;
- }
- }
-
- curVoice->curPtr = (Ptr) (SndBuffer + (long) (aCC>>BYTEDIV));
- }
-
- curVoice->lAC = aCC & ((1 << BYTEDIV) - 1);
- }
-
- void Sampler16Addin16Poly( Channel *curVoice, register short *ASCBuffer, short chanNo, MADDriverRec* intDriver)
- {
- short i = intDriver->ASCBUFFER, vol, tByte;
- short *SndBuffer;
- long chnVol, off;
-
- ///
- long aDD, aCC = curVoice->lAC;
-
- aDD = (AMIGA_CLOCKFREQ2 << BYTEDIV) / ( curVoice->period * (intDriver->DriverSettings.outPutRate>>16));
- ///
-
- if( curVoice->curPtr >= curVoice->maxPtr && curVoice->loopSize == 0) return;
-
- SndBuffer = (short*) curVoice->curPtr;
- vol = (short) 64 * intDriver->trackDiv; // * 2; //intDriver->trackDiv;
- chnVol = ((DoVol( curVoice) * intDriver->VolExt[ curVoice->ID])/ 64);
-
- if( SndBuffer + 1 + (long) ((aCC + aDD * intDriver->ASCBUFFER)>>BYTEDIV) >= ( short*) curVoice->maxPtr)
- {
- if( intDriver->DriverSettings.Interpolation)
- {
- long RightWeight, LeftWeight;
-
- while( i-- > 0)
- {
- RightWeight = aCC & ((1 << BYTEDIV) - 1); LeftWeight = (1 << BYTEDIV) - RightWeight;
-
- off = (aCC>>BYTEDIV);
- if( SndBuffer + off + 1 >= (short*) curVoice->maxPtr)
- {
- if( curVoice->loopSize > 0)
- {
- SndBuffer -= curVoice->loopSize/2;
- if( SndBuffer + off < (short*) curVoice->begPtr) SndBuffer = (short*) curVoice->begPtr - off;
- }
- else break;
- }
-
- tByte = (( LeftWeight **(SndBuffer + off)
- + RightWeight **(SndBuffer + off + 1)) >> BYTEDIV);
-
- *ASCBuffer += (tByte * chnVol) / vol; aCC += aDD;
- ASCBuffer += chanNo;
- }
- }
- else
- {
- while( i-- > 0)
- {
- off = (aCC>>BYTEDIV);
- if( SndBuffer + off + 1 >= (short*) curVoice->maxPtr)
- {
- if( curVoice->loopSize > 0)
- {
- SndBuffer -= curVoice->loopSize;
- if( SndBuffer + off < (short*) curVoice->begPtr) SndBuffer = (short*) curVoice->begPtr - off;
- }
- else break;
- }
- *ASCBuffer += (*(SndBuffer + off) * chnVol) / vol; aCC += aDD;
- ASCBuffer += chanNo;
- }
- }
-
- if( curVoice->loopSize > 0) curVoice->curPtr = (Ptr) (SndBuffer + (long) (aCC>>BYTEDIV));
- else
- {
- curVoice->samplePtr = 0L; curVoice->curPtr = curVoice->maxPtr;
- }
- }
- else
- {
- if( intDriver->DriverSettings.Interpolation)
- {
- long RightWeight, LeftWeight;
-
- while( i-- > 0)
- {
- RightWeight = aCC & ((1 << BYTEDIV) - 1); LeftWeight = (1 << BYTEDIV) - RightWeight;
-
- off = (aCC>>BYTEDIV);
- tByte = (( LeftWeight **(SndBuffer + off)
- + RightWeight **(SndBuffer + off + 1)) >> BYTEDIV);
-
- *ASCBuffer += (tByte * chnVol) / vol; aCC += aDD;
- ASCBuffer += chanNo;
- }
- }
- else
- {
- while( i-- > 0)
- {
- off = (aCC>>BYTEDIV);
- *ASCBuffer += (*(SndBuffer + off) * chnVol) / vol; aCC += aDD;
- ASCBuffer += chanNo;
- }
- }
- curVoice->curPtr = (Ptr) (SndBuffer + (long) (aCC>>BYTEDIV));
- }
-
- curVoice->lAC = aCC & ((1 << BYTEDIV) - 1);
- }
-
- void Sample16BufferAddPoly( Channel *curVoice, register short *ASCBuffer, short chanNo, MADDriverRec* intDriver)
- {
- if( curVoice->amp == 16) Sampler16Addin16Poly( curVoice, ASCBuffer, chanNo, intDriver);
- else Sampler16AddPoly( curVoice, ASCBuffer, chanNo, intDriver);
- }
-
- void Play16PolyPhonic( MADDriverRec* intDriver)
- {
- long i, x;
- short *aLPtr = (short*) intDriver->IntDataPtr;
-
- x = intDriver->DriverSettings.numChn * intDriver->ASCBUFFER;
- while( x-- > 0) *aLPtr++ = 0;
-
- for( i = 0 ; i < intDriver->DriverSettings.numChn; i++)
- {
- Sample16BufferAddPoly( &intDriver->chan[ i], (short*) (intDriver->IntDataPtr) + i, intDriver->DriverSettings.numChn, intDriver);
- }
- }
-
- void Play16Mono( MADDriverRec* intDriver)
- {
- short i;
- short *ttt = (short*) intDriver->IntDataPtr;
-
- i = intDriver->ASCBUFFER;
- while( i-- > 0) *ttt++ = 0;
-
- for( i = 0 ; i < intDriver->DriverSettings.numChn; i++)
- {
- Sample16BufferAddPoly( &intDriver->chan[ i], (short*) intDriver->IntDataPtr, 1, intDriver);
- }
- }